package com.pet.controller;

import com.pet.bean.*;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class OwnerPart {
    //登录
    public static Integer loginOwner(ObjectOutputStream oos, ObjectInputStream ois) {
        // --实现控制台和用户的交互：【主人登录：读取主人的账号、密码】
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入账号");
        String loginName = sc.next();
        System.out.println("请输入密码");
        String pass = sc.next();
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("loginOwner");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("loginName", loginName);
        map.put("pw", pass);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println("宠物主人："+notification.getMap().get("name")+ " 登陆成功");
            } else {
                System.out.println(notification.getMap().get("message"));
                //重新调用
                loginOwner(oos, ois);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        //返回o_id
        return (Integer) notification.getMap().get("o_id");
    }
    //注册
    public static void registerOwner(ObjectOutputStream oos, ObjectInputStream ois) {
        // --实现控制台和用户的交互：【主人登录：读取主人的账号、密码】
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String newName = sc.next();
        System.out.println("请输入密码");
        String newPw = sc.next();
        System.out.println("请输入财富");
        double newWea = Double.parseDouble(sc.next());
        Owner newOwner = new Owner(newName, newPw, newWea);
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("registerOwner");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("newOwner", newOwner);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println("注册成功");
                //注册后不显示信息
//                System.out.println("当前宠物主人" + notification.getMap().get("newOwner"));
            } else {//登录失败
                System.out.println(notification.getMap().get("message"));
                //重新调用
                registerOwner(oos, ois);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //查找宠物
    public static boolean checkPet(Integer o_id,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("checkPet");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println("查询成功,宠物信息如下");
                //遍历输出宠物列表
                List<Pet> pets  = (List<Pet>) notification.getMap().get("my-list");
                for (Pet pet : pets) {
                    System.out.println("宠物ID:"+pet.getPet_id()+" 名字:"+pet.getName()+
                            " 主人ID:"+pet.getOwner_id()+" 价格:"+pet.getWorth()+" 类型:"+pet.getType());
                }
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return notification.isFlag();
    }
    //查找主人
    public static void checkOwner(Integer o_id,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("checkOwner");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println("查询成功,你的信息如下");
                Owner owner = (Owner) notification.getMap().get("my-info");
                System.out.println("主人ID:"+owner.getOwner_id()+" 名字:"+owner.getName()+" 密码:"+owner.getPassword()+
                            " 财富:"+owner.getWealth()+" 状态:"+owner.getStatus());
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //更新名字
    public static void updateOwnerName(Integer o_id,String name,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("updateOwnerName");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        map.put("name", name);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println(notification.getMap().get("success"));
            } else {
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //更新密码
    public static void updateOwnerPw(Integer o_id,String password,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("updateOwnerPw");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        map.put("pw", password);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println(notification.getMap().get("success"));
            } else {
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //更新财富
    public static void updateOwnerWea(Integer o_id,double wealth,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("updateOwnerWea");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        map.put("wea", wealth);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println(notification.getMap().get("success"));
            } else {
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //查看记录
    public static void checkAccount(Integer o_id,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("checkAccount");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println("查询成功,交易记录如下");
                //遍历输出宠物列表
                List<Account> accounts  = (List<Account>) notification.getMap().get("account-list");
                for (Account account : accounts) {
                    if (account.getType()==1){
                        System.out.println("出售者-商店ID:"+account.getSale_id()+" 购买者-主人ID:"+account.getBuy_id()+
                                " 交易宠物ID:"+account.getPet_id()+ " 价格:"+account.getPrice()+" 交易时间:"+account.getOrder_date());
                    }else if (account.getType()==2){
                        System.out.println("出售者-主人ID:"+account.getSale_id()+" 购买者-商店ID:"+account.getBuy_id()+
                                " 交易宠物ID:"+account.getPet_id()+" 价格:"+account.getPrice()+" 交易时间:"+account.getOrder_date());
                    }
                }
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //注销
    public static void deleteOwner(Integer o_id,ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("deleteOwner");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println(notification.getMap().get("success"));
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //查找所有宠物
    public static void checkAllPet(ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("checkAllPet");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
//                System.out.println(notification.getMap().get("pet-list"));
                System.out.println("可以购买的宠物有：");
                List<Pet> pets  = (List<Pet>) notification.getMap().get("pet-list");
                for (Pet pet : pets) {
                    System.out.println("ID:"+pet.getPet_id()+" 名字:"+pet.getName()+" 商店ID:"+pet.getStore_id()+
                            " 主人ID:"+pet.getOwner_id()+" 价格:"+pet.getWorth()+" 类型:"+pet.getType());
                }
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //查找所有商店
    public static void checkAllPetstore(ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("checkAllPetstore");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
//                System.out.println(notification.getMap().get("pet-list"));
                System.out.println("可以选择的宠物商店有：");
                List<Petstore> petstores  = (List<Petstore>) notification.getMap().get("petstore-list");
                for (Petstore petstore : petstores) {
                    System.out.println("ID:"+petstore.getStore_id()+" 名字:"+petstore.getName());
                }
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    //买
    public static boolean ownerBuyPet(Integer o_id,Integer p_id, ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("ownerBuyPet");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        map.put("p_id", p_id);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println(notification.getMap().get("success"));
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return notification.isFlag();
    }
    //卖
    public static boolean ownerSellPet(Integer o_id,Integer p_id,Integer s_id, ObjectOutputStream oos, ObjectInputStream ois){
        // --发送请求：可以使用一个方法来封装
        // 给服务端发送Notification数据【action、map】
        Notification notification = new Notification();
        //设置action、service、map，boolean不需要（给服务器提供的）
        notification.setAction("ownerSellPet");
        notification.setService("OwnerService");
        HashMap<String, Object> map = new HashMap<>();
        map.put("o_id", o_id);
        map.put("p_id", p_id);
        map.put("s_id", s_id);
        notification.setMap(map);

        try {
            //执行发送
            oos.writeObject(notification);
            //等待服务器处理后，接收服务器返回的数据
            notification = (Notification) ois.readObject();

            if (notification.isFlag()) {
                System.out.println(notification.getMap().get("success"));
            } else {//查询失败
                System.out.println(notification.getMap().get("message"));
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return notification.isFlag();
    }
}
